
package TokensDelLenguaje;

import PolacaInversa.Registro;
import java.util.ArrayList;

public class Token_OperadorMul extends Token_Operador {

    public Token_OperadorMul(){
        super(Tokens.asterisco);
    }
    
    public ArrayList conversionImplicita(Token o1, Token o2, Registro reg) {
        ArrayList list = new ArrayList();
        String s = "";
        Tokens op1 = o1.getId();
        Tokens op2 = o2.getId();
        //La logica de la tabla de conversion para este operador
        if (op1 == Tokens.const_uinteger && op2 == Tokens.const_uinteger) {
            s += "MOV ax, " + o2.getNombre() + "\n";
            s += "MUL " + o1.getNombre() + "\n";
            list.add(s);
        }
            else if (op1 == Tokens.const_ulongint && op2 == Tokens.const_ulongint) {
                s += "MOV eax, " + o2.getNombre() + "\n";
                s += "MUL " + o1.getNombre() + "\n";
                list.add(s);
            }
                else if (op1 == Tokens.const_uinteger && op2 == Tokens.const_ulongint) {

                    s = conversion(o1, reg);
                    s += "MOV eax, " + reg.nombre + "\n";
                    s += "MUL " + o2.getNombre() + "\n";
                    list.add(s);
                }
                    else if (op1 == Tokens.const_ulongint && op2 == Tokens.const_uinteger) {
                        //Generar Assembler.
                        s = conversion(o2,reg);
                        s += "MOV eax, " + reg.nombre + "\n";
                        s += "MUL " + o1.getNombre() + "\n";
                        list.add(s);
                    }
        list.add(0, true);
        return list;
    }
   
    @Override
    public ArrayList traducir_assembler(Token o1, Token o2, Registro reg){
        ArrayList list = super.traducir_assembler(o1, o2, reg);
        ArrayList l = new ArrayList();
        String s = (String) list.get(1);
        s += "JO overflow\n";
        if(o1.getId() == Tokens.const_ulongint || o2.getId() == Tokens.const_ulongint)
            s += "MOV " + reg.nombre + ", eax\n";
        else
            s += "MOV " + reg.nombre + ", ax\n";
        l.add(list.get(0));
        l.add(s);
        return l;
    }    
    
}
